package top.llove.code.system.system.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.csource.common.MyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import top.llove.code.system.common.CommonController;
import top.llove.code.system.system.mapper.SysFileMapper;
import top.llove.code.system.system.pojo.SysFile;
import top.llove.code.system.system.service.YSysFileService;
import top.llove.common.exception.ServiceException;
import top.llove.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.llove.common.utils.StringUtils;
import top.llove.common.utils.file.FileTypeUtils;
import top.llove.common.utils.file.FileUtils;
import top.llove.common.utils.file.fastdfs.FastDFSFile;
import top.llove.common.utils.file.fastdfs.FastDFSUtils;
import top.llove.framework.config.AdminConfig;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

/**
 * 文件上传Service业务层处理
 *
 * @author: 幸会
 * @date: 2021-12-19
 * @email: 1846724873@qq.com
 * @description: 文件上传Service业务层处理
 * @version: 1.0
 */
@Service
public class SysFileServiceImpl implements YSysFileService {

    private static final Logger log = LoggerFactory.getLogger(SysFileServiceImpl.class);
    @Autowired
    private SysFileMapper sysFileMapper;

    /**
     * 查询文件上传
     *
     * @param fileId 文件上传主键
     * @return 文件上传
     */
    @Override
    public SysFile selectSysFileByFileId(Long fileId) {
        return sysFileMapper.selectSysFileByFileId(fileId);
    }

    /**
     * 查询文件上传列表
     *
     * @param sysFile 文件上传
     * @return 文件上传
     */
    @Override
    public List<SysFile> selectSysFileList(SysFile sysFile) {
        return sysFileMapper.selectSysFileList(sysFile);
    }

    /**
     * 新增文件上传
     *
     * @param sysFile 文件上传
     * @return 结果
     */
    @Override
    public int insertSysFile(SysFile sysFile) {
        sysFile.setCreateTime(DateUtils.getNowDate());
        return sysFileMapper.insertSysFile(sysFile);
    }

    /**
     * 修改文件上传
     *
     * @param sysFile 文件上传
     * @return 结果
     */
    @Override
    public int updateSysFile(SysFile sysFile) {
        sysFile.setUpdateTime(DateUtils.getNowDate());
        return sysFileMapper.updateSysFile(sysFile);
    }

    /**
     * 批量删除文件上传
     *
     * @param fileIds 需要删除的文件上传主键
     * @return 结果
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = ServiceException.class)
    @Override
    public int deleteSysFileByFileIds(Long[] fileIds) throws Exception {
        for (long id : fileIds) {
            SysFile file = sysFileMapper.selectSysFileByFileId(id);
            if (StringUtils.isNull(file)) {
                throw new ServiceException("ID为" + id + "的文件不存在！");
            }
            FastDFSUtils.deleteFile(file.getGroupName(), file.getFileName());
        }
        return sysFileMapper.deleteSysFileByFileIds(fileIds);
    }

    /**
     * 删除文件上传信息
     *
     * @param fileId 文件上传主键
     * @return 结果
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = ServiceException.class)
    @Override
    public int deleteSysFileByFileId(Long fileId) throws Exception {
        SysFile file = sysFileMapper.selectSysFileByFileId(fileId);
        if (StringUtils.isNull(file)) {
            throw new ServiceException("ID为" + fileId + "的文件不存在！");
        }
        FastDFSUtils.deleteFile(file.getGroupName(), file.getFileName());

        return sysFileMapper.deleteSysFileByFileId(fileId);
    }


    /**
     * 上传文件
     *
     * @param file
     * @return java.util.Map<java.lang.String, java.lang.Object>
     * @author 幸会
     * @date 2021/12/20 13:43
     */
    @Override
    public Map<String, Object> upload(MultipartFile file) throws MyException, IOException {

        Map<String, Object> upload = FastDFSUtils.upload(file);
        return upload;
    }

    /**
     * 文件下载
     *
     * @param id   文件ID
     * @param resp 响应
     * @author 幸会
     * @date 2021/12/26 19:38
     */
    @Override
    public void download(long id, HttpServletResponse resp) throws IOException {
        SysFile file = sysFileMapper.selectSysFileByFileId(id);

        if (StringUtils.isNull(file)) {
            throw new ServiceException("文件不存在！");
        }

        InputStream download = FastDFSUtils.download(file.getGroupName(), file.getFileName());


        if (StringUtils.isNull(download)) {
            throw new ServiceException("文件不存在! ");
        }

        try
        {

            resp.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(resp, file.getFileOldName());
            FileUtils.writeBytes(download, resp.getOutputStream());
        }
        catch (Exception e)
        {
            log.error("下载文件失败", e);
        }
    }
}
